<?php

namespace Yousheng\Ku\Commands;

use Illuminate\Console\Command;
use Yousheng\Ku\Ku;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Yousheng\Ku\Contracts\AdminRight;

/**
 * 所有命令的基类
 * ku:create-database 需要管理员权限，不用初始化表
 * ku:database:create-migrations 需要管理员权限，初始化指定库表
 * ku:database:create-seeder 需要管理员权限，不用初始化表格
 * ku:database:create-factories 需要管理员权限，不用初始化表格
 * ku:database:generate-faker-seeders 需要管理员权限，不用初始化表格
 * ku:database:generate-models 需要管理员权限，不用初始化表格
 * ku:database:generate-nova 需要管理员权限，不用初始化表格
 * ku:database:generate-relation 需要管理员权限，不用初始化表格
 * ku:database:generate-models 需要管理员权限，不用初始化表格
 * ku:database:generate-models 需要管理员权限，不用初始化表格
 */
class KuCommand extends Command
{
    protected ?string $database = null; 
    protected $pdo;
    // handle() 之前会执行 initialize() , interact() , configure()
    // 所有Ku命令共用部分
    protected function interact(InputInterface $input, OutputInterface $output)
    {
        parent::interact($input, $output);
        $this->initKuCommand();
    }

    public function initKuCommand()
    {
        // $admin = $this->hasAdminRight();
        // if($admin){
        //     [$username, $password] = $this->getAsk();
        // }

        // if ($admin) {
        //     Ku::setAdminConnectioConfig([
        //         'driver' => 'mysql',
        //         'database' => $database,
        //         'host' => $host,
        //         'port' => $port,
        //         'username' => $username,
        //         'password' => $password,
        //     ]);
        // } 
        // if(!$admin){
        //     Ku::initTables(null, $admin);
        // }
    }

    public function getAsk(){
        $this->info("命令: ".$this->getName()." 需要管理员权限,请输入管理员权限的用户名和密码");
            $username = $this->ask('mysql root name');
            $password = $this->ask('root password');
            return [$username, $password];
    }

    public function getAppDatabaseConfig(){
        $database = env('DB_DATABASE', false);
        $host = env('DB_HOST', '127.0.0.1');
        $port = env('DB_PORT', 3306);
        $username = env('DB_USERNAME', false);
        $password = env('DB_PASSWORD', false);
        return [$database,$host,$port,$username,$password];
    }

    // 旧方案是：定义一个属性 $adminRight=false，子类中值为true，表示子类是需要管理员权限的
    public function hasAdminRight(){
        return $this instanceof AdminRight;
    }

    public function getConection($admin=false){
        return  $admin ? Ku::getAdminConnection() : Ku::getDefaultConnection(); // $connection->getConfig()
    }
    public function databaseExists($databaseName)
    {
        try {
            return count($this->getConection(true)->getPdo()->query("SHOW DATABASES LIKE '{$databaseName}'")->fetchAll()) > 0;

            // // 尝试连接到指定数据库
            // $pdo = new \PDO(
            //     "mysql:host={$config['host']};dbname={$databaseName}",
            //     $config['username'],
            //     $config['password']
            // );

            // // 如果没有抛出异常，说明数据库存在
            // return true;
        } catch (\PDOException $e) {
            // 捕获异常，说明数据库可能不存在
            return false;
        }
    }
}
